import pygame
from math import sin,cos
import random

# 创建<角色类>
class Character(pygame.sprite.Sprite):
    # 构造函数
    def __init__(self, screen):
        # 调用父类的初始化方法
        pygame.sprite.Sprite.__init__(self)
        # 屏幕
        self.screen = screen
        # 设置名称
        self.name = "角色"
        # 坐标位置
        self.x = 0
        self.y = 0
        # 设置大小
        self.size = 1
        # 设置面向方向
        self.direction = 0
        # 设置显示/隐藏
        self.visible = True
        # 图片
        self.image = ""
        # 创建图片列表
        self.image_list = []
        # 创建图片索引
        self.image_index = 0
        # 添加 Sprites 属性
        self.sprites = pygame.sprite.Group()

    # 绘制
    def draw(self):
        if self.visible:
            self.screen.blit(self.image, (self.x, self.y))

    # 设置显示/隐藏
    def set_visible(self, visible):
        self.visible = visible

    # 加载图片
    def load_image(self, image):
        # 加载图片
        self.image = pygame.image.load(image)
        # 获取图片的宽高
        self.width, self.height = self.image.get_size()
        # 缩放图片
        self.image = pygame.transform.scale(self.image, (self.width * self.size, self.height * self.size))
        # 获取图片的矩形区域
        self.rect = self.image.get_rect()
        # 设置图片的矩形区域的位置
        self.rect.topleft = (self.x, self.y)
        # 添加图片到列表
        self.image_list.append(self.image)
        # 设置图片索引
        self.image_index = 0

    # 加载多张图片
    def load_image_list(self, images):
        # 遍历图片列表
        for image in images:
            # 加载图片
            self.load_image(image)

    # 设置角色大小
    def set_size(self, size):
        # 传递size值
        self.size = size
        # 获取当前图片的宽度和高度
        width, height = self.image.get_size()
        # 遍历图片列表
        for index,image in enumerate(self.image_list):
            # 调整图片大小
            image = pygame.transform.scale(image, (width * size, height * size))
            # 添加图片到列表
            self.image_list[index] = image
        # 传递self.image=image
        self.image = self.image_list[self.image_index]
        # 更新图片的矩形区域
        self.rect = self.image.get_rect()
        # 设置图片的矩形区域位置
        self.rect.topleft = (self.x, self.y)

    # 设置图片索引
    def set_image_index(self, index):
        # 判断索引是否超出列表长度
        if index >= len(self.image_list):
            index = 0

        # 获取图片索引
        self.image_index = index
        # 获取图片
        self.image = self.image_list[self.image_index]
        # 获取图片的矩形区域
        self.rect = self.image.get_rect()
        # 设置图片的矩形区域位置
        self.rect.topleft = (self.x, self.y)

    # 变化下一个图片造型
    def change_next_image(self):
        # 获取图片索引
        index = self.image_index + 1
        # 获取图片列表长度
        length = len(self.image_list)
        # 判断索引是否超出列表长度
        if index >= length:
            index = 0
        # 获取图片索引
        self.image_index = index
        # 获取图片
        self.image = self.image_list[self.image_index]

    # 变化随机的图片造型
    def change_random_image(self):
        # 获取图片列表长度
        length = len(self.image_list)
        # 获取随机索引
        index = random.randint(0, length - 1)
        # 获取图片索引
        self.image_index = index
        # 获取图片
        self.image = self.image_list[self.image_index]

    # 设置坐标位置
    def set_position(self, x, y):
        # 设置坐标位置
        self.x = x
        self.y = y
        # 获取图片的矩形区域
        self.rect = self.image.get_rect()
        # 设置图片的矩形区域位置
        self.rect.topleft = (self.x, self.y)

    # 设置面向方向
    def set_direction(self, direction):
        # 设置面向方向
        self.direction = direction
        # 旋转图片
        self.image = pygame.transform.rotate(self.image_list[self.image_index], self.direction)
        # 更新图片的矩形区域
        self.rect = self.image.get_rect(center=self.rect.center)
        # 更新位置
        self.rect.x = self.x
        self.rect.y = self.y

    # 移动x,y
    def move(self, x, y):
        # 移动
        self.x += x
        self.y += y
        # 移动图片
        self.rect.x = self.x
        self.rect.y = self.y

    # 根据面向方向移动
    def move_by_direction(self, distance):
        # 根据distance,self.direction的方向计算x,y的移动距离
        distance_x = distance * cos(self.direction * 3.14 / 180)
        distance_y = -distance * sin(self.direction * 3.14 / 180)
        # 移动
        self.move(distance_x, distance_y)

    # 销毁对象
    def destroy(self):
        # 标记对象已被销毁
        self._destroyed = True
        # 从所有精灵组中移除
        if hasattr(self, 'groups'):
            for group in self.groups():
                group.remove(self)

    # 碰撞检测
    def collision(self, obj):
        # 检测碰撞
        hits = pygame.sprite.spritecollide(self, obj, True)
        # 返回结果
        return hits